package com.blame.javacup.simulador;

import org.javahispano.javacup.model.Tactic;
import org.javahispano.javacup.model.engine.Partido;

public class SimuladorDuelo {

	public static ResultadoDuelo simular(Class<? extends Tactic> class1, Class<? extends Tactic> class2, int iter) throws Exception {
		Partido p = null;
		int gl = 0, gv = 0, pg = 0, pp = 0, pe = 0, gtl = 0, gtv = 0, mgl = 0, mgv = 0, mingl = 100;
		int pgp = 0, ppp = 0;
		double posesion = 0;

		System.out.println("Duelo entre " + class1.getSimpleName() + " y " + class2.getSimpleName());
		for (int i = 0; i < iter; i++) {
			System.out.println("Simulando partido " + (i + 1) + " de " + iter);
			gl = 0;
			gv = 0;
			p = new Partido(class1.newInstance(), class2.newInstance(), false);

			p.inicioRapido();
	        while(p.getEstado() != 7) {
	            p.iterar();
	            System.out.print("|");
	            if(p.getIteracion() % 900 == 0)
	                System.out.println("");
	        }
            System.out.println("");
	        
			gl = gl + p.getGolesLocal();
			gv = gv + p.getGolesVisita();
			posesion += p.getPosecionBalonLocal();
			if (gl > mgl) {
				mgl= gl;
			}
			if (gv > mgv) {
				mgv= gv;
			}
			if (gl < mingl) {
				mingl  = gl;
			}
			if (p.getGolesLocal() == p.getGolesVisita()) {
				if(p.getPosecionBalonLocal() > 0.5)
					pgp++;
				else if(p.getPosecionBalonLocal() < 0.5)
					ppp++;
				else
					pe++;
			}
			if (p.getGolesLocal() > p.getGolesVisita()) {
				pg++;
			}
			if (p.getGolesLocal() < p.getGolesVisita()) {
				pp++;
			}
			gtl += gl;
			gtv += gv;
		}
//		String visita = format(String.format("                      %s", p.getDetalleVisita().getNombre()), 22);
//		String ppg = format(String.format("    %.1f", pg * 100f / iter), 5);
//		String ppp = format(String.format("    %.1f", pp * 100f / iter), 5);
//		String ppe = format(String.format("    %.1f", pe * 100f / iter), 5);
//		String sgl = format(String.format("     %d", gtl), 7);
//		String sgv = format(String.format("     %d", gtv), 7);
//		String smgl = format(String.format(" %d", mgl), 2);
//		String smgv = format(String.format(" %d", mgv), 2);
//		String smingl = format(String.format(" %d", mingl), 2);
//		String pos = format(String.format("  %d", Math.round((posesion * 100 / iter))), 3);

		System.out.println("-----------------------------------------");
		System.out.println(p.getDetalleLocal().getTacticName() + ":");
		System.out.println("Partidos ganados:        " + pg);
		System.out.println("Partidos ganados (pos):  " + pgp);
		System.out.println("Partidos perdidos:       " + pp);
		System.out.println("Partidos perdidos (pos): " + ppp);
		System.out.println("Partidos empatados:      " + pe);
		System.out.println("Goles a favor:   " + gtl);
		System.out.println("Goles en contra: " + gtv);
		System.out.println("Maximo goles a favor: " + mgl);
		System.out.println("Maximo goles en contra: " + mgv);
		System.out.println("Minimo goles a favor: " + mingl);
		System.out.println("Posesion: " + Math.round((posesion * 100) / iter));

		ResultadoDuelo rd = new ResultadoDuelo(class1, class2, pg, pgp, pp, ppp, pe, gtl, gtv, Math.round((posesion * 100) / iter));
		return rd;
	}

}
